#include "pole.h"
#include <iostream>

pole::pole(const size_t posX, const size_t posY, const bool kolor):
_posX(posX + 1), //ustawienie tego w konstruktorze spowoduje zmniejszenie operacji do wykonania w pozniejszym etapie
_posY(posY + 1), // patrz gora
_bialykolor(kolor),
_wsk_figura(NULL)
{
}

size_t pole::ZwrocTypFigury() const
{
	if (czy_wolne() == true)
	{
		return 7; //jesli pole jest wolne zwracamy 7
	}
	else
	{
		return _wsk_figura->ZwrocTypFigury();
	}
}

void pole::ZdealokujFigure()
{
	delete _wsk_figura;
	//_wsk_figura = NULL; // i tak dalsze metody pozniej to robia
}

bool pole::ZwrocKolorFigury() const
{
	if (czy_wolne() == true)
	{
		return false;
	}
	else
	{
		return _wsk_figura->czy_bialy();
	}
}

bool pole::czy_wolne() const
{
	return _wolne;
}

const bool pole::ZwrocKolorPola() const
{
	return _bialykolor;
}

void pole::UstawPolePuste()
{
	_wolne = true;
	_wsk_figura = NULL; //jesli pole jest puste ten wskaznik musi wskazywac na NULL!!!
}

void pole::UstawPoleZajete()
{
	_wolne = false;
}

const string pole::daj_wspX() const
{
	switch(_posX) //instrukcja break nie jest konieczna
	{
		case 1: return "A";
		case 2: return "B";
		case 3: return "C";
		case 4: return "D";
		case 5: return "E";
		case 6: return "F";
		case 7: return "G";
		case 8: return "H";
		default: return "Wystapil blad";
	}

}

const string pole::daj_wspY() const
{
	switch(_posY) //instrukcja break nie jest konieczna
	{
		case 1: return "1";
		case 2: return "2";
		case 3: return "3";
		case 4: return "4";
		case 5: return "5";
		case 6: return "6";
		case 7: return "7";
		case 8: return "8";
		default: return "Wystapil blad";
	}

}

pole::pole(const pole& j_pole): //konstruktor kopiujacy
_posX(j_pole._posX),
_posY(j_pole._posY),
_bialykolor(j_pole._bialykolor)
{
}

pole& pole::operator=(const pole x) //przeciazanie operatora =
{
	return *this;
}

void pole::UtworzFigureWedlugTypu(const int typ, const bool kolor)
{

	switch (typ)
		{
		case 0:
			{
				_wsk_figura = new Goniec(kolor); 
				UstawPoleZajete();
				break;
			}
		case 1:
			{
				_wsk_figura = new Hetman(kolor);
				UstawPoleZajete();
				break;
			}
		case 2:
			{
				_wsk_figura = new Kon(kolor);
				UstawPoleZajete();
				break;
			}
		case 3:
			{
				_wsk_figura = new Krol(kolor);
				UstawPoleZajete();
				break;
			}
		case 4:
			{
				_wsk_figura = new Pionek(1,kolor);
				UstawPoleZajete();
				break;
			}
		case 5:
			{
				_wsk_figura = new Pionek(0,kolor);
				UstawPoleZajete();
				break;
			}
		case 6:
			{
				_wsk_figura = new Wieza(kolor);
				UstawPoleZajete();
				break;
			}
		case 7:
			{
				UstawPolePuste();
				break;
			}
		default:
			{
				throw BladAlokacjiFigury();
				break;
			}

		}
}

const bool pole::czy_bialy() const
{
	if (_wolne) return false; //bardzo uzyteczne zabezpieczenie
	else return _wsk_figura->czy_bialy();
}

Figura* pole::ZwrocWskNaFigure()
{
	return _wsk_figura;
}

void pole::UstawFaktZePionekWykonalSwojPierwszyRuch()
{
	dynamic_cast<Pionek *> (_wsk_figura)->UstawFaktZePionekWykonalSwojPierwszyRuch(); //zadziala tylko jesli _wsk_figura bedzie wskaznikiem na pionka (RTTI jest genialne :) )
}